package com.biup.okex.core.dao.base;



import com.biup.okex.core.page.QueryResult;

import java.util.List;

/**
 * Created by zhangzhii on 2018/6/29.
 */
public interface IBaseDao {

    /**
     * 查询统计 根据对象条件统计
     *
     * @param object
     * @return
     */
    public <T> Integer count(Object object);

    /**
     * 查询统计
     *
     * @param statementPostfix
     *            自定义方法
     * @param object
     *            PO对象
     * @return
     */
    public <T> Integer count(String statementPostfix, Object object);

    /**
     * 自定义查询
     *
     * @param statement
     * @return
     */
    public <T> T selectOne(String statement);

    /**
     * 根据 T 查询数据
     *
     * @param object
     * @return
     */
    public <T> T selectOne(Object object);

    /**
     * 自定义查询数据
     *
     * @param statementPostfix
     *            自定义方法名称
     * @param object
     *            数据对象
     * @return
     */
    public <T> T selectOne(String statementPostfix, Object object);

    /**
     * 插入对象
     *
     * @param statement
     * @param obj
     * @return @
     */
    public <T> int insert(String statement, Object obj);

    /**
     * 插入一条记录
     *
     * @param entity
     * @return @
     */
    public <T> int insert(T entity);

    /**
     * 批量插入数据
     *
     * @param list
     * @return @
     */
    public <T> int insert(List<T> list);

    /**
     * 自定义更新
     *
     * @param statement
     * @return @
     */
    public int update(String statement);

    /**
     * 更新对象(此方法只根据主键ID进行更新)
     *
     * @param entity
     * @return @
     */
    public int update(Object entity);

    /**
     * 更新对象 (注意:传入参数必须保证参数的可靠性，不然可能会导致错误的更新数据,请谨慎使用)
     *
     * @param setParameter
     *            update语句中用于set的参数
     * @param whereParameter
     *            update语句中用于where条件的参数
     * @return @
     */
    @Deprecated
    public int update(Object setParameter, Object whereParameter);

    /**
     * 自定义更新方法
     *
     * @param statementPostfix
     *            方法路径名称
     * @param entity
     * @return @
     */
    public int update(String statementPostfix, Object entity);

    /**
     * 删除
     *
     * @param entity
     * @return @
     */
    public int delete(Object entity);

    /**
     * 自定义删除方法
     *
     * @param statementPostfix
     * @param entity
     * @return @
     */
    public int delete(String statementPostfix, Object entity);

    /**
     * 自定义查询
     *
     * @param statement
     * @return
     */
    public <T> List<T> selectList(String statement);

    /**
     * 查询一个列表， 不分页,不排序
     *
     * @param entity
     *            实体对象
     * @return
     */
    public <T> List<T> selectList(Object entity);

    /**
     * 查询一个列表， 不分页,不排序
     *
     * @param statementPostfix
     *            自定义sql名称
     */
    public <T> List<T> selectList(String statementPostfix, Object entity);

    /**
     * 查询一个列表， 不分页
     *
     * @param entity
     *            实体对象
     * @param orderBy
     *            排序sql 例：'id desc'
     * @return
     */
    public <T> List<T> selectList(T entity, String orderBy);

    /**
     * 查询一个列表， 不分页
     *
     * @param statementPostfix
     *            自定义sql名称
     * @param orderBy
     *            排序sql 例：'id desc'
     */
    public <T> List<T> selectList(String statementPostfix, Object entity, String orderBy);

    /**
     * 分页查询 不排序
     *
     * @param entity
     * @param pageNum
     *            页码
     * @param pageSize
     *            每页记录数
     * @return
     */
    public <T> List<T> selectList(Object entity, int pageNum, int pageSize);

    /**
     * 分页查询 不排序
     *
     * @param statementPostfix
     * @param entity
     * @param pageNum
     *            页码
     * @param pageSize
     *            每页记录数
     * @return
     */
    public <T> List<T> selectList(String statementPostfix, Object entity, int pageNum, int pageSize);

    /**
     * 分页查询
     *
     * @param entity
     * @param pageNum
     *            页码
     * @param pageSize
     *            每页记录数
     * @param orderBy
     *            排序sql 例：'id desc'
     *
     * @return
     */
    public <T> List<T> selectList(Object entity, int pageNum, int pageSize, String orderBy);

    /**
     * 分页查询
     *
     * @param statementPostfix
     * @param entity
     * @param pageNum
     *            页码
     * @param pageSize
     *            每页记录数
     * @param orderBy
     *            排序sql 例：'id desc'
     * @return
     */
    public <T> List<T> selectList(String statementPostfix, Object entity, int pageNum, int pageSize, String orderBy);

    /**
     * 此方法返回数据结果集和count
     *
     * @param statementPostfix
     *            自定义方法名(mybatis namespace)
     * @param entity
     *            参数对象
     * @param pageNum
     *            页码
     * @param pageSize
     *            每页记录数
     * @param orderBy
     *            排序字段(例：'id desc')
     * @return
     */
    public <T> QueryResult<T> selectListAndCount(String statementPostfix, Object entity, int pageNum, int pageSize,
                                                 String orderBy);

    /**
     * 此方法返回数据结果集和count
     *
     * @param statementPostfix
     *            自定义方法名(mybatis namespace)
     * @param entity
     *            参数对象
     * @param pageNum
     *            页码
     * @param pageSize
     *            每页记录数
     * @param orderBy
     *            排序字段(例：'id desc')
     * @param statementCount
     *            自定义count查询语句
     * @return
     */
    public <T> QueryResult<T> selectListAndCount(String statementPostfix, Object entity, int pageNum, int pageSize,
                                                 String orderBy, String statementCount);
}
